package com.fangcun.common.util.baidu;

import java.util.Map;

import org.springframework.util.StringUtils;

import com.fangcun.common.canstant.ErrCode;
import com.fangcun.common.canstant.PublicConstant;
import com.fangcun.common.exception.ProAffairException;
import com.fangcun.common.exception.ProRunTimeException;
import com.fangcun.common.util.http.HttpClientTools;
import com.fangcun.common.util.json.JSONTools;

/**
 * @作者： 陳曉鬆 @时间： 2020年5月18日 - 上午11:59:50 @description：->
 */
public class BaiduUtils {

	/** 根据地址获取百度坐标 **/
	public static Coordinate getCoordinate(String address) throws ProAffairException {
		String url = "http://api.map.baidu.com/geocoding/v3/?address=" + address + "&output=json&ak=" + PublicConstant.BAIDU_AK;
		String response = HttpClientTools.get(url, null, null);
		if (StringUtils.isEmpty(response)) {
			throw new ProRunTimeException(ErrCode.FAIL.getReturnCode(), "百度坐标获取失败");
		}
		Map<String, Object> map = JSONTools.convertJsonStrToMap(response);
		if (0 != Integer.valueOf(map.get("status").toString())) {
			throw new ProRunTimeException(ErrCode.FAIL.getReturnCode(), "百度坐标获取失败:" + response);
		}
		if (!StringUtils.isEmpty(map.get("result")) && !StringUtils.isEmpty(JSONTools.convertJsonStrToMap(map.get("result").toString()).get("location"))) {
			map = JSONTools.convertJsonStrToMap(JSONTools.convertJsonStrToMap(map.get("result").toString()).get("location").toString());
			Coordinate coordinate = new Coordinate();
			coordinate.setLng(Double.valueOf(map.get("lng").toString()));
			coordinate.setLat(Double.valueOf(map.get("lat").toString()));
			return coordinate;
		}
		throw new ProRunTimeException(ErrCode.FAIL.getReturnCode(), "百度坐标获取失败:" + response);
	}

	/** 补充：计算两点之间真实距离 @return 米 */
	public static double getDistance(double longitude1, double latitude1, double longitude2, double latitude2) {
		// 维度
		double lat1 = (Math.PI / 180) * latitude1;
		double lat2 = (Math.PI / 180) * latitude2;

		// 经度
		double lon1 = (Math.PI / 180) * longitude1;
		double lon2 = (Math.PI / 180) * longitude2;

		// 地球半径
		double R = 6380;

		// 两点间距离 km，如果想要米的话，结果*1000就可以了
		double d = Math.acos(Math.sin(lat1) * Math.sin(lat2) + Math.cos(lat1) * Math.cos(lat2) * Math.cos(lon2 - lon1)) * R;

		return d * 1000;
	}

}
